<?php
defined('IN_LK') or die('Access Denied');
lk::lo('model', '', 0);
class ipbanned_model extends model
{
	public function __construct()
	{
		$this->tablename = 'ipbanned';
		parent::__construct();
	}
	
	/**
	 * 检查客户端ip是否被禁止
	 * @return 禁止返回TRUE
	 */
	final public function is_banned()
	{
		$bans = array();
		$bans = get_cache('ipbanned');
		$ip   = get_ip();
		if(!empty($bans))
		{
			foreach($bans as $ban)
			{
				if(false !== strpos($ban['ip'], '*'))
				{
					$min = $this->convert_ip('min', $ban['ip']);
					$max = $this->convert_ip('max', $ban['ip']);
					$res = $this->ip_forbidden($ip, $min, $max);
					if(!$res && $ban['expire']> TIME)
					{
						return true;
					}
				}
				else
				{
					if($ip == $ban['ip'] && $ban['expire']> TIME)
					{
						return true;
					}
				}
			}
		}
		return false;
	}
	
	/**
	 * ip格式化
	 * @param string 模式 max | min
	 * @param string $ip    ip地址 可以是127.0.0.1 或者 127.0.* 或者 127.0.0.*
	 * @return string $res  返回格式化的ip 可以是127.0.0.1 或者 127.0.255.255 或者 127.0.0.255 127.0.0.1(min)
	 */
	final public function convert_ip($option, $ip)
	{
		$ip_temp = array();
		$ip_parts = explode('.', $ip);
		$val = $option == 'max' ? 255 : 1;
		$i = 0;
		foreach($ip_parts as $ip_part)
		{
			$i ++;
			$ip_temp[] = $ip_part == '*' ? $val : $ip_part;
		}
		for($i = 4 - $i; $i> 0; $i --)
		{
			$ip_temp[] = $val;
		}
		$res = implode('.', $ip_temp);
		return $res;
	}
	
	/**
	 * 判断ip是否在被限制的ip段内
	 * 被限制返回false
	 */
	final public function ip_forbidden($ip, $from, $to)
	{
		$from = strcmp($ip, $from);
		$to   = strcmp($ip, $to);
		if($from>= 0 && $to <=0)
		{
			return false;
		}
		return true;
	}
}